let csd=GetCurrentScriptDirectory;

let img=[];
let IMG_EFFECTS=csd~"img\effects.png";
let IMG_BOMB=csd~"img\bomb.png";

let SE_SHOT="sePlayerShot01.wav";
let SE_BOMB=csd~"se\bomb.wav";

let objhit=NULL;
let objslowr=NULL;
let objslowl=NULL;
let obji=NULL;



sub onInitialize{
	SetPlayerLifeImage(IMG_PLAYER,0,0,48,48);
	SetGrazeCircle(32);
	SetRebirthFrame(8);
	SetRebirthFrameReduction(0);
	SetItemCollectLine(144);
	SetInitialBombCount(3);
	SetAutoEffect(false);
	
	LoadGraphic(IMG_EFFECTS);
	LoadGraphic(IMG_BOMB);
	
	LoadSE(SE_SHOT);
	LoadSE(SE_BOMB);
}



sub onMissed{
	if(!OnBorderOfLife){
		SetPlayerInvincibility(251);
	}
}



sub onDrawLoop{
	SetTexture(IMG_PLAYER);
	if(GetKeyState(VK_RIGHT)==KEY_HOLD){
		SetGraphicRect(0,96,48,144);
	}else if(GetKeyState(VK_LEFT)==KEY_HOLD){
		SetGraphicRect(0,48,48,96);
	}else{
		SetGraphicRect(0,0,48,48);
	}
	
	if(GetTimeOfPlayerInvincibility>0){
		if(GetTimeOfPlayerInvincibility%6<2){
			SetColor(0,0,255);
		}
	}
	DrawGraphic(GetPlayerX,GetPlayerY);
	SetColor(255,255,255);
	
	DrawObject;
}



sub onFinalize{
	ascent(n in 0..length(img)){DeleteGraphic(img[n]);}
	DeleteGraphic(IMG_EFFECTS);
	DeleteGraphic(IMG_BOMB);
	DeleteSE(SE_SHOT);
	DeleteSE(SE_BOMB);
}



task th10_System{
	DeleteEnemyShotOnMissed;
	InvincibleEffect;
	SlowEffect(0,0);
	HitMarker(0,0);

	HitEffect;
	MissEffect;
	
	task DeleteEnemyShotOnMissed{
		let r;
		let x;
		let y;
		let dr=25;
		loop{
			while(!OnMissed || OnBorderOfLife){yield;}
			r=140;
			x=GetPlayerX;
			y=GetPlayerY;
			loop(32){yield;}
			loop(100){
				DeleteEnemyShotInCircle(SHOT,x,y,r);
				r+=dr;
				yield;
			}
			while(OnMissed){yield;}
			yield;
		}
	}
	
	
	
	task InvincibleEffect{
		let obj=Obj_Create(OBJ_EFFECT);
		obji=obj;
		let r=60;
		let scale=0;
		let flg=true;
		ObjEffect_SetTexture(obj,IMG_EFFECTS);
		ObjEffect_SetLayer(obj,5);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,66);
		ascent(n in 0..33){
			ObjEffect_SetVertexUV(obj,n*2,128+n,192);
			ObjEffect_SetVertexUV(obj,n*2+1,128+n,200);
		}
		ascent(n in 0..33){
			ObjEffect_SetVertexXY(obj,n*2,r*cos((360/32)*n),r*sin((360/32)*n));
			ObjEffect_SetVertexXY(obj,n*2+1,(r+4)*cos((360/32)*n),(r+4)*sin((360/32)*n));
		}
		loop(10800){
			if(flg && (!OnMissed || OnBorderOfLife)){
				scale=GetTimeOfPlayerInvincibility;
				if(scale>60){scale=60;}
				scale/=60;
			}else{
				scale=0;
			}
			ObjEffect_SetScale(obj,scale,scale);
			yield;
		}
		Obj_Delete(obj);
		InvincibleEffect;
	}
	
	
	
	task SlowEffect(scale,ang){
		let dscale=0.1;
		let dang=3;
		let alpha=192;
		let objr=Obj_Create(OBJ_EFFECT);
		objslowr=objr;
		ObjEffect_SetTexture(objr,IMG_EFFECTS);
		ObjEffect_SetLayer(objr,3);
		ObjEffect_SetPrimitiveType(objr,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(objr,4);
		ObjEffect_SetVertexUV(objr,0,192,128);
		ObjEffect_SetVertexUV(objr,1,192,192);
		ObjEffect_SetVertexUV(objr,2,256,128);
		ObjEffect_SetVertexUV(objr,3,256,192);
		ObjEffect_SetVertexXY(objr,0,-32,-32);
		ObjEffect_SetVertexXY(objr,1,-32,32);
		ObjEffect_SetVertexXY(objr,2,32,-32);
		ObjEffect_SetVertexXY(objr,3,32,32);
		
		let objl=Obj_Create(OBJ_EFFECT);
		objslowl=objl;
		ObjEffect_SetTexture(objl,IMG_EFFECTS);
		ObjEffect_SetLayer(objl,3);
		ObjEffect_SetPrimitiveType(objl,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(objl,4);
		ObjEffect_SetVertexUV(objl,0,192,128);
		ObjEffect_SetVertexUV(objl,1,192,192);
		ObjEffect_SetVertexUV(objl,2,256,128);
		ObjEffect_SetVertexUV(objl,3,256,192);
		ObjEffect_SetVertexXY(objl,0,-32,-32);
		ObjEffect_SetVertexXY(objl,1,-32,32);
		ObjEffect_SetVertexXY(objl,2,32,-32);
		ObjEffect_SetVertexXY(objl,3,32,32);
		ascent(n in 0..4){
			ObjEffect_SetVertexColor(objr,n,alpha,255,255,255);
			ObjEffect_SetVertexColor(objl,n,alpha,255,255,255);
		}
		loop(10800){
			if(!OnMissed){
				if(GetKeyState(VK_SLOWMOVE)){
					if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH){
						scale=2;
					}
					if(scale>1){
						scale-=dscale;
					}
				}else{
					if(scale>0){
						scale-=dscale;
					}
				}
				ObjEffect_SetScale(objr,scale,scale);
				ObjEffect_SetScale(objl,scale,scale);
			}
			ang+=dang;
			ang%=360;
			ObjEffect_SetAngle(objr,0,0,ang-22.5);
			ObjEffect_SetAngle(objl,0,0,-ang-22.5);
			yield;
		}
		Obj_Delete(objr);
		Obj_Delete(objl);
		SlowEffect(scale,ang);
	}
	
	
	
	task HitMarker(scale,ang){
		let obj=Obj_Create(OBJ_EFFECT);
		objhit=obj;
		let dscale=0.1;
		let dang=3;
		ObjEffect_SetTexture(obj,IMG_EFFECTS);
		ObjEffect_SetLayer(obj,5);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexUV(obj,0,176,160);
		ObjEffect_SetVertexUV(obj,1,176,174);
		ObjEffect_SetVertexUV(obj,2,190,160);
		ObjEffect_SetVertexUV(obj,3,190,174);
		ObjEffect_SetVertexXY(obj,0,-7,-7);
		ObjEffect_SetVertexXY(obj,1,-7,7);
		ObjEffect_SetVertexXY(obj,2,7,-7);
		ObjEffect_SetVertexXY(obj,3,7,7);
		loop(10800){
			if(!OnMissed){
				if(GetKeyState(VK_SLOWMOVE)){
					if(scale<0.9){
						scale+=dscale;
					}
					if(scale>=0.9){
						scale=0.9;
					}
				}else{
					if(scale>0){
						scale-=dscale;
					}
					if(scale<=0){
						scale=0;
					}
				}
				ObjEffect_SetScale(obj,scale,scale);
			}
			ang+=dang;
			ObjEffect_SetAngle(obj,0,0,ang);
			yield;
		}
		Obj_Delete(obj);
		HitMarker(scale,ang);
	}
	
	
	
	task HitEffect{
		loop{
			while(!OnMissed){yield;}
			Effect;
			while(OnMissed){yield;}
			yield;
		}
		
		task Effect{
			let obj=Obj_Create(OBJ_EFFECT);
			let size=12;
			let dsize=(180-size)/24;
			let alpha=128;
			let dalpha=alpha/24;
			ObjEffect_SetTexture(obj,IMG_EFFECTS);
			ObjEffect_SetLayer(obj,5);
			ObjEffect_SetRenderState(obj,ADD);
			ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
			ObjEffect_CreateVertex(obj,4);
			ObjEffect_SetVertexUV(obj,0,0,0);
			ObjEffect_SetVertexUV(obj,1,0,128);
			ObjEffect_SetVertexUV(obj,2,128,0);
			ObjEffect_SetVertexUV(obj,3,128,128);
			
			Obj_SetPosition(obj,GetPlayerX,GetPlayerY);
			loop(24){
				alpha-=dalpha;
				ascent(n in 0..4){
					ObjEffect_SetVertexColor(obj,n,alpha,255,255,255);
				}
				size+=dsize;
				ObjEffect_SetVertexXY(obj,0,-size,-size);
				ObjEffect_SetVertexXY(obj,1,-size,size);
				ObjEffect_SetVertexXY(obj,2,size,-size);
				ObjEffect_SetVertexXY(obj,3,size,size);
				yield;
			}
			Obj_Delete(obj);
		}
	}
	
	
	
	task MissEffect{
		loop{
			while(!OnMissed || OnBorderOfLife){yield;}
			loop(3){Effect;}
			while(OnMissed){yield;}
			yield;
		}
		
		task Effect{
			let obj=Obj_Create(OBJ_EFFECT);
			let size=0;
			let dsize=2;
			let alpha=255;
			let dalpha=alpha/6;
			ObjEffect_SetTexture(obj,IMG_EFFECTS);
			ObjEffect_SetLayer(obj,5);
			ObjEffect_SetRenderState(obj,ALPHA);
			ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
			ObjEffect_CreateVertex(obj,4);
			ObjEffect_SetVertexUV(obj,0,128,160);
			ObjEffect_SetVertexUV(obj,1,128,184);
			ObjEffect_SetVertexUV(obj,2,152,160);
			ObjEffect_SetVertexUV(obj,3,152,184);
			Obj_SetPosition(obj,GetPlayerX,GetPlayerY);
			loop(12){
				size+=dsize;
				ObjEffect_SetVertexXY(obj,0,-size,-size);
				ObjEffect_SetVertexXY(obj,1,-size,size);
				ObjEffect_SetVertexXY(obj,2,size,-size);
				ObjEffect_SetVertexXY(obj,3,size,size);
				yield;
			}
			loop(6){
				alpha-=dalpha;
				ascent(n in 0..4){ObjEffect_SetVertexColor(obj,n,alpha,255,255,255);}
				yield;
			}
			Obj_Delete(obj);
		}
	}
}



sub DrawObject{
	Obj_SetPosition(obji,GetPlayerX,GetPlayerY);
	Obj_SetPosition(objslowr,GetPlayerX,GetPlayerY);
	Obj_SetPosition(objslowl,GetPlayerX,GetPlayerY);
	Obj_SetPosition(objhit,GetPlayerX,GetPlayerY);
}



task PlayShotSE{
	let obj=Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,GetPlayerX,GetPlayerY);
	Obj_SetSpeed(obj,0);
	Obj_SetAngle(obj,0);
	Obj_SetCollisionToPlayer(obj,false);
	ObjShot_SetGraphic(obj,1);
	ObjShot_SetDamage(obj,0);
	ObjShot_SetPenetration(obj,1);
	if(!Obj_BeDeleted(obj)){
		PlaySE(SE_SHOT);
	}
	Obj_Delete(obj);
}